#include "listas.h"

Tentrada *crear_entrada() {

	Tentrada *entrada = malloc(sizeof(Tentrada));
	entrada->Nodo = NULL;
	entrada->cant_elem = 0;
	return entrada;
}

void lista_agregar(Tentrada *entrada, t_elemento *dato) {

	TNodoLista *nuevo = calloc(1, sizeof(TNodoLista));
	TNodoLista *punt;
	TNodoLista *puntAnt;
	nuevo->dato = (void*) dato;
	nuevo->Next = NULL;
	punt = entrada->Nodo;
	if (entrada->Nodo == NULL) {
		entrada->Nodo = nuevo;
	} else {
		while (punt != NULL) {
			puntAnt = (TNodoLista*) punt;
			punt = (TNodoLista*) punt->Next;
		}
		puntAnt->Next = nuevo;

	}
	entrada->cant_elem++;
}

t_elemento* lista_buscar(Tentrada *lista, char nombre[32]) {
	TNodoLista *nodo = lista->Nodo;
	t_elemento *elemento = NULL;
	elemento = calloc(1, sizeof(t_elemento));

	while (nodo != NULL) {
		memcpy(elemento, (t_elemento*) nodo->dato, sizeof(t_elemento));
		if (!strcmp(elemento->nombre, nombre)) {
			return (t_elemento*) nodo->dato;
		} else
			nodo = (TNodoLista*) nodo->Next;

	}
	return NULL;
}

int32_t lista_tamanio(Tentrada *lista) {
	return lista->cant_elem;
}

void lista_borrar(t_elemento *elemento,Tentrada *dirElemento){
	TNodoLista *aux,*aux1;


	t_elemento *elemento_aux = calloc(1, sizeof(t_elemento));

	aux = dirElemento->Nodo;
	memcpy(elemento_aux, (t_elemento*) aux->dato, sizeof(t_elemento));

	if(!strcmp(elemento_aux->nombre,elemento->nombre)){
		if(dirElemento->Nodo->Next == NULL){
			liberar_lista(elemento->contenido);
			free(dirElemento->Nodo->dato);
			free(dirElemento->Nodo);
			dirElemento->Nodo = NULL;
			dirElemento->cant_elem = 0;
		}
	}
	else{

	while(strcmp(elemento_aux->nombre,elemento->nombre)){
		aux= (TNodoLista*) aux->Next;
		memcpy(elemento_aux, (t_elemento*) aux->dato, sizeof(t_elemento));
	}
	aux1=aux;
	aux = (TNodoLista*) aux->Next;
	liberar_lista(elemento->contenido);
	free(aux1->dato);
	free(aux1);
	}
}




void liberar_lista(Tentrada *contenido){
	TNodoLista *nodo,*ant;
	t_elemento *elemento = calloc(1, sizeof(t_elemento));


	while(contenido != NULL){
		//entre, -> es un directorio
		nodo=contenido->Nodo;

		while(nodo!=NULL){
			//entre, -> el directorio tiene algo adentro
			memcpy(elemento, (t_elemento*) nodo->dato, sizeof(t_elemento));
			liberar_lista(elemento->contenido);
			ant=nodo;
			nodo=nodo->Next;

			free(ant->dato);
			free(ant);

		}

	}
	free(elemento);
}





